Proportions and differential expression
rr pathway_timepoint_cytotoxic <- gage_analysis(sce = sce_follicular_normalized_labeled_full %>% scater::filter(celltype == T cells), comparison_type = , filter_ribo = filter_ribo, filter_mito = filter_mito, gene_set_path = /datadrive/projects/cellassign-analysis/downloads/c2.cp.reactome.v6.2.symbols.gmt, rowdat = rowData(sce_follicular_normalized_labeled_full))
plot_markers(pathway_timepoint_cytotoxic$pathways %>% plyr::rename(c(‘pathway’=‘Symbol’, ‘q.val’=‘FDR’, ‘mean_logFC’=‘logFC’)) %>% dplyr::mutate(is_significant = FDR <= 0.05), top_n = 5, log_q_val_threshold = NULL, nrow = 1, subtitle = 2 vs. T1, top_direction = )
Upregulation of PD-1 (PD-1 blockade?) in cytotoxic T cells at T2? CHECK if this corresponds to membership in the IFNG-containing subcluster of CD8 T cells.
rr pathway_timepoint_naive <- gage_analysis(sce = sce_follicular_normalized_labeled_full %>% scater::filter(celltype == /CM CD4), comparison_type = , filter_ribo = filter_ribo, filter_mito = filter_mito, gene_set_path = /datadrive/projects/cellassign-analysis/downloads/c2.cp.reactome.v6.2.symbols.gmt, rowdat = rowData(sce_follicular_normalized_labeled_full))
plot_markers(pathway_timepoint_naive$pathways %>% plyr::rename(c(‘pathway’=‘Symbol’, ‘q.val’=‘FDR’, ‘mean_logFC’=‘logFC’)) %>% dplyr::mutate(is_significant = FDR <= 0.05), top_n = 5, log_q_val_threshold = NULL, nrow = 1, subtitle = 2 vs. T1, top_direction = )
rr pathway_timepoint_naive$pathways %>% dplyr::filter(q.val < 0.05) %>% dplyr::arrange(-mean_logFC) %>% head(10)
rr pathway_timepoint_malignantb <- gage_analysis(sce = sce_follicular_normalized_labeled_full %>% scater::filter(celltype == cells & malignant_status_manual == ), comparison_type = , filter_ribo = filter_ribo, filter_mito = filter_mito, gene_set_path = /datadrive/projects/cellassign-analysis/downloads/c2.cp.reactome.v6.2.symbols.gmt, rowdat = rowData(sce_follicular_normalized_labeled_full))
Joining by: pathway
rr plot_markers(pathway_timepoint_malignantb$pathways %>% plyr::rename(c(‘pathway’=‘Symbol’, ‘q.val’=‘FDR’, ‘mean_logFC’=‘logFC’)) %>% dplyr::mutate(is_significant = FDR <= 0.05), top_n = 5, log_q_val_threshold = NULL, nrow = 1, subtitle = 2 vs. T1, top_direction = )


rr pathway_timepoint_malignantb$pathways %>% dplyr::filter(q.val < 0.05) %>% dplyr::arrange(-mean_logFC) %>% head(10)
rr pathway_timepoint_nonmalignantb <- gage_analysis(sce = sce_follicular_normalized_labeled_full %>% scater::filter(celltype == cells & malignant_status_manual == ), comparison_type = , filter_ribo = filter_ribo, filter_mito = filter_mito, gene_set_path = /datadrive/projects/cellassign-analysis/downloads/c2.cp.reactome.v6.2.symbols.gmt, rowdat = rowData(sce_follicular_normalized_labeled_full))
plot_markers(pathway_timepoint_nonmalignantb$pathways %>% plyr::rename(c(‘pathway’=‘Symbol’, ‘q.val’=‘FDR’, ‘mean_logFC’=‘logFC’)) %>% dplyr::mutate(is_significant = FDR <= 0.05), top_n = 5, log_q_val_threshold = NULL, nrow = 1, subtitle = 2 vs. T1, top_direction = )
rr pathway_timepoint_FL1018malignantb <- gage_analysis(sce = sce_follicular_normalized_labeled_full %>% scater::filter(celltype == cells & malignant_status_manual == & patient == 1018), comparison_type = , filter_ribo = filter_ribo, filter_mito = filter_mito, gene_set_path = /datadrive/projects/cellassign-analysis/downloads/c2.cp.reactome.v6.2.symbols.gmt, rowdat = rowData(sce_follicular_normalized_labeled_full))
Joining by: pathway

LS0tCnRpdGxlOiAiRm9sbGljdWxhciBkYXRhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3IgZ2xvYmFsX2NodW5rX29wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgdGlkeSA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUUsIGNhY2hlLmxhenkgPSBGQUxTRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDQuNSkKCmtuaXRyOjpvcHRzX3RlbXBsYXRlJHNldChldmFsZmlnID0gbGlzdChmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gNykpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KbGlicmFyeShrbml0cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGVuc29yZmxvdykKbGlicmFyeShTaW5nbGVDZWxsRXhwZXJpbWVudCkKbGlicmFyeShzY2F0ZXIpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShwaGVhdG1hcCkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ2FnZSkKCmxpYnJhcnkoc2NybmEudXRpbHMpCmxpYnJhcnkoc2NybmEuc2NldXRpbHMpCmxpYnJhcnkoY2VsbGFzc2lnbikKbGlicmFyeShjZWxsYXNzaWduLnV0aWxzKQpsaWJyYXJ5KHZkai51dGlscykKbGlicmFyeShTZXVyYXQpCgpsaWJyYXJ5KGluZm90aGVvKQpsaWJyYXJ5KGxtZXJUZXN0KQoKIyBCaW9jTWFuYWdlcjo6aW5zdGFsbChjKCJFeHBlcmltZW50SHViIiwgIlRhYnVsYU11cmlzRGF0YSIsICJEdW9DbHVzdGVyaW5nMjAxOCIsICJNdWx0aUFzc2F5RXhwZXJpbWVudCIpKQojIGluc3RhbGwucGFja2FnZXMoYygibG1lclRlc3QiLCAiYXJpY29kZSIpKQpgYGAKCiMgSW50cm9kdWN0aW9uCgoKIyMgT3V0bGluZQoKKiBFeHBlcmltZW50YWwgc3Vic3RyYXRlcwoqIFFDIHN0YXRzCiogUHJlbGltaW5hcnkgYW5hbHlzaXMKKiBOZXh0IHN0ZXBzCgojIyBFeHBlcmltZW50YWwgc3Vic3RyYXRlcwoKRGF0YSBmb3IgNSBwcmUtIGFuZCBwb3N0LXRyZWF0bWVudCBwYWlyczoKClRyYW5zZm9ybWVkIEZMOgoKKiBGTDEwMDQKKiBGTDEwMTIKKiBGTDEwMTgKClByb2dyZXNzZWQgRkw6CgoqIEZMMjAwMQoKIyBEYXRhCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gRkFMU0V9CmRhdGFfZGlyIDwtICIvZGF0YWRyaXZlL2RhdGEvZm9sbGljdWxhciIKZmlsdGVyZWRfbWF0cml4X2RpcnMgPC0gU3lzLmdsb2IoZmlsZS5wYXRoKGRhdGFfZGlyLCAiKiIsICJmaWx0ZXJlZF9nZW5lX2JjX21hdHJpY2VzIiwgIkdSQ2gzOCIpKQoKbmFtZXMoZmlsdGVyZWRfbWF0cml4X2RpcnMpIDwtIHN0cmluZ3I6OnN0cl9leHRyYWN0KGZpbHRlcmVkX21hdHJpeF9kaXJzLCAiKD88PWZvbGxpY3VsYXJcXC8pLiooPz1cXC9maWx0ZXJlZF9nZW5lX2JjX21hdHJpY2VzKSIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQpzY2VfZm9sbGljdWxhciA8LSBEcm9wbGV0VXRpbHM6OnJlYWQxMHhDb3VudHModW5uYW1lKGZpbHRlcmVkX21hdHJpeF9kaXJzKSkKc2NlX2ZvbGxpY3VsYXIgPC0gc2NlX2ZvbGxpY3VsYXIgJT4lIHNjYXRlcjo6bXV0YXRlKAogIGRhdGFzZXQgPSBzdHJfZXh0cmFjdChTYW1wbGUsICJGTFswLTldK1tBLVowLTlfXSsiKSwKICBzYW1wbGVfYmFyY29kZSA9IHBhc3RlKGRhdGFzZXQsIEJhcmNvZGUsIHNlcCA9ICJfIikKKQoKc2NlX2ZvbGxpY3VsYXIkcGF0aWVudCA8LSBzdHJfZXh0cmFjdChzY2VfZm9sbGljdWxhciRkYXRhc2V0LCAiXkZMWzAtOV0rIikKc2NlX2ZvbGxpY3VsYXIkdGltZXBvaW50IDwtIHN0cl9leHRyYWN0KHNjZV9mb2xsaWN1bGFyJGRhdGFzZXQsICJUWzEtMl0oPz0oX1JbMC05XSspPyQpIikKc2NlX2ZvbGxpY3VsYXIkcmVwbGljYXRlIDwtIHN0cl9leHRyYWN0KHNjZV9mb2xsaWN1bGFyJGRhdGFzZXQsICJSWzAtOV0rJCIpCnNjZV9mb2xsaWN1bGFyJHJlcGxpY2F0ZVtpcy5uYShzY2VfZm9sbGljdWxhciRyZXBsaWNhdGUpXSA8LSAiUjEiCnNjZV9mb2xsaWN1bGFyJHRyYW5zZm9ybWVkX3Byb2dyZXNzZWQgPC0gaWZlbHNlKHN0cl9kZXRlY3Qoc2NlX2ZvbGxpY3VsYXIkcGF0aWVudCwgIl5GTDEiKSwgIlRyYW5zZm9ybWVkIiwgIlByb2dyZXNzZWQiKQpzY2VfZm9sbGljdWxhciRzdGF0dXMgPC0gd2l0aChjb2xEYXRhKHNjZV9mb2xsaWN1bGFyKSwgaWZlbHNlKHRpbWVwb2ludCA9PSAiVDIiLCB0cmFuc2Zvcm1lZF9wcm9ncmVzc2VkLCAiUHJpbWFyeSIpKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmJhdGNoZXMgPC0gbGlzdCgnMSc9YygiRkwxMDA0VDEiLCAiRkwxMDA0VDIiLCAiRkwxMDEyVDEiLCAiRkwxMDEyVDIiLCAiRkwxMDE4VDEiLCAiRkwxMDE4VDIiKSwKICAgICAgICAgICAgICAgICcyJz1jKCJGTDIwMDFUMSIsICJGTDIwMDFUMiIsICJGTDIwMDJUMiIpLAogICAgICAgICAgICAgICAgJzMnPWMoIkZMMjAwMlQxIiksCiAgICAgICAgICAgICAgICAnNCc9YygiRkwxMjU2VDFfUjEiLCAiRkwxMjU2VDFfUjIiLCAiRkwxMjU2VDJfUjEiLCAiRkwxMjU2VDJfUjIiKSkKCmJhdGNoX21hcCA8LSBkYXRhLmZyYW1lKHJlcChuYW1lcyhiYXRjaGVzKSwgc2FwcGx5KGJhdGNoZXMsIGxlbmd0aCkpLCB1bmxpc3QoYmF0Y2hlcykpIApjb2xuYW1lcyhiYXRjaF9tYXApIDwtIGMoImJhdGNoIiwgImRhdGFzZXQiKQoKc2NlX2ZvbGxpY3VsYXIgPC0gc2NlX2ZvbGxpY3VsYXIgJT4lIHNjYXRlcjo6bXV0YXRlKGJhdGNoPWRmX2FzX21hcChiYXRjaF9tYXAsIGRhdGFzZXQsIGZyb20gPSAiZGF0YXNldCIsIHRvID0gImJhdGNoIikpCgpwcmludChzY2VfZm9sbGljdWxhcikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpzY2VfZm9sbGljdWxhcl9maWx0MSA8LSBzY2VfZm9sbGljdWxhciAlPiUgc2NhdGVyOjpmaWx0ZXIoZGF0YXNldCAlaW4lIGMoIkZMMTAwNFQxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGTDEwMDRUMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkwxMDEyVDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZMMTAxMlQyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGTDEwMThUMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkwxMDE4VDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZMMjAwMVQxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGTDIwMDFUMiIpKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmdldF9lbnNlbWJsX2lkIDwtIGZ1bmN0aW9uKHgsIHJvd2RhdCwgc3ltYm9sX25hbWUgPSAiU3ltYm9sIiwgZ2VuZV9uYW1lID0gIklEIikgewogIHJvd2RhdCA8LSBhcy5kYXRhLmZyYW1lKHJvd2RhdCkKICBkZl9hc19tYXAocm93ZGF0ICU+JSBzdWJzZXQoeCAlaW4lIHJvd2RhdFssc3ltYm9sX25hbWVdKSwgeCwgZnJvbSA9IHN5bWJvbF9uYW1lLCB0byA9IGdlbmVfbmFtZSkKfQoKbWl0b19nZW5lcyA8LSBhcy5jaGFyYWN0ZXIocm93RGF0YShzY2VfZm9sbGljdWxhcikkU3ltYm9sW3N0cl9kZXRlY3Qocm93RGF0YShzY2VfZm9sbGljdWxhcikkU3ltYm9sLCAiXk1UXFwtIildKSAlPiUgCiAgZ2V0X2Vuc2VtYmxfaWQocm93RGF0YShzY2VfZm9sbGljdWxhcikpCgpyaWJvX2dlbmVzIDwtIGFzLmNoYXJhY3Rlcihyb3dEYXRhKHNjZV9mb2xsaWN1bGFyKSRTeW1ib2xbc3RyX2RldGVjdChyb3dEYXRhKHNjZV9mb2xsaWN1bGFyKSRTeW1ib2wsICJeUlAoTHxTKSIpXSkgJT4lCiAgZ2V0X2Vuc2VtYmxfaWQocm93RGF0YShzY2VfZm9sbGljdWxhcikpCgpzY2VfZm9sbGljdWxhcl9maWx0MSA8LSBjYWxjdWxhdGVRQ01ldHJpY3Moc2NlX2ZvbGxpY3VsYXJfZmlsdDEsIGV4cHJzX3ZhbHVlcyA9ICJjb3VudHMiLCBmZWF0dXJlX2NvbnRyb2xzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChtaXRvY2hvbmRyaWFsPW1pdG9fZ2VuZXMsIHJpYm9zb21hbD1yaWJvX2dlbmVzKSkKYGBgCgojIyBNaXRvY2hvbmRyaWFsIGNvdW50cwoKYGBge3IsIGVjaG8gPSBGQUxTRX0KZGYgPC0gd2l0aChjb2xEYXRhKHNjZV9mb2xsaWN1bGFyX2ZpbHQxKSwgZGF0YS5mcmFtZShwY3RfbWl0b2Nob25kcmlhbD1wY3RfY291bnRzX21pdG9jaG9uZHJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0X3JpYm9zb21hbD1wY3RfY291bnRzX3JpYm9zb21hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfaWQ9ZGF0YXNldCkpCgptaXRvX3RocmVzIDwtIDUKCmdncGxvdChkZiwgYWVzKHg9cGN0X21pdG9jaG9uZHJpYWwpKSArIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsPXNldF9pZCkpICsgdGhlbWVfYncoKSArIHRoZW1lX1B1YmxpY2F0aW9uKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbG9nX3NjYWxlX2JyZWFrcygpLCBsYWJlbHMgPSBsb2dfc2NhbGVfbGFiZWxzKCksIHRyYW5zID0gImxvZyIpICsgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1taXRvX3RocmVzKSwgY29sb3VyID0gInJlZCIpICsgeGxhYigiJSBtaXRvIikKYGBgCgojIyBSaWJvc29tYWwgY291bnRzCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpyaWJvX3RocmVzIDwtIDYwCgpnZ3Bsb3QoZGYsIGFlcyh4PXBjdF9yaWJvc29tYWwpKSArIGdlb21faGlzdG9ncmFtKGFlcyhmaWxsPXNldF9pZCkpICsgdGhlbWVfYncoKSArIHRoZW1lX1B1YmxpY2F0aW9uKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbG9nX3NjYWxlX2JyZWFrcygpLCBsYWJlbHMgPSBsb2dfc2NhbGVfbGFiZWxzKCksIHRyYW5zID0gImxvZyIpICsgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdD1yaWJvX3RocmVzKSwgY29sb3VyID0gInJlZCIpICsgeGxhYigiJSByaWJvIikKYGBgCgojIyBGaWx0ZXJpbmcKCmBgYHtyLCBlY2hvID0gRkFMU0V9CnNjZV9mb2xsaWN1bGFyX2ZpbHQyIDwtIGZpbHRlcl9jZWxscyhzY2VfZm9sbGljdWxhcl9maWx0MSwgbm1hZHMgPSAzLCB0eXBlID0gImxvd2VyIiwgbG9nID0gVFJVRSwgbWF4X21pdG8gPSBtaXRvX3RocmVzLCBtYXhfcmlibyA9IHJpYm9fdGhyZXMpCmBgYAoKIyMgTm9ybWFsaXphdGlvbgoKYGBge3IsIGVjaG8gPSBGQUxTRX0Kbm9ybV9mYWN0b3JzIDwtIGVkZ2VSOjpjYWxjTm9ybUZhY3RvcnMoYXMubWF0cml4KGNvdW50cyhzY2VfZm9sbGljdWxhcl9maWx0MikpLCBtZXRob2QgPSAiVE1NIikKbGliX3NpemVfZmFjdG9ycyA8LSBjb2xTdW1zKGFzLm1hdHJpeChjb3VudHMoc2NlX2ZvbGxpY3VsYXJfZmlsdDIpKSkKc2l6ZUZhY3RvcnMoc2NlX2ZvbGxpY3VsYXJfZmlsdDIpIDwtIG5vcm1fZmFjdG9ycyAqIGxpYl9zaXplX2ZhY3RvcnMgLyBtZWFuKG5vcm1fZmFjdG9ycyAqIGxpYl9zaXplX2ZhY3RvcnMpCgpzY2VfZm9sbGljdWxhcl9maWx0MiRzaXplX2ZhY3RvciA8LSBzaXplRmFjdG9ycyhzY2VfZm9sbGljdWxhcl9maWx0MikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gRkFMU0V9CnNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQgPC0gbm9ybWFsaXNlKHNjZV9mb2xsaWN1bGFyX2ZpbHQyKQoKc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCA8LSBydW5QQ0Eoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCwgbnRvcCA9IDEwMDAsIG5jb21wb25lbnRzID0gNTAsIGV4cHJzX3ZhbHVlcyA9ICJsb2djb3VudHMiKQpzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkIDwtIHJ1blRTTkUoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCwgdXNlX2RpbXJlZCA9ICJQQ0EiLCBuX2RpbXJlZCA9IDUwLCBuY29tcG9uZW50cyA9IDIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KcGxvdFRTTkUoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCwgY29sb3VyX2J5ID0gImRhdGFzZXQiLCBuY29tcG9uZW50cyA9IDIpCmBgYAoKCiMjIFRvdGFsIG51bWJlciBvZiBVTUlzCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwbG90UENBKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQsIGNvbG91cl9ieSA9ICJsb2cxMF90b3RhbF9jb3VudHMiKQpgYGAKCiMjIENlbGwgY3ljbGUKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KaHMucGFpcnMgPC0gcmVhZFJEUyhzeXN0ZW0uZmlsZSgiZXhkYXRhIiwgImh1bWFuX2N5Y2xlX21hcmtlcnMucmRzIiwgcGFja2FnZT0ic2NyYW4iKSkKCmFzc2lnbm1lbnRzIDwtIGN5Y2xvbmUoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCwgaHMucGFpcnMsIGdlbmUubmFtZXM9cm93RGF0YShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkKSRJRCwgbWluLml0ZXIgPSAxMCwgaXRlciA9IDEwMCwgdmVyYm9zZSA9IFRSVUUsIEJQUEFSQU0gPSBNdWx0aWNvcmVQYXJhbSgxNSkpCgpzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkQGNvbERhdGEgPC0gYmluZF9jb2xzKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRAY29sRGF0YSAlPiUgYXMuZGF0YS5mcmFtZSwgYXNzaWdubWVudHMkbm9ybWFsaXplZC5zY29yZXMpICU+JSBEYXRhRnJhbWUKc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCA8LSBzY2F0ZXI6Om11dGF0ZShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkLCBDZWxsX0N5Y2xlID0gYXNzaWdubWVudHMkcGhhc2VzKQpgYGAKCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwbG90UENBKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQsIGNvbG91cl9ieSA9ICJDZWxsX0N5Y2xlIikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwbG90VFNORShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkLCBjb2xvdXJfYnkgPSAiQ2VsbF9DeWNsZSIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICdhc2lzJ30Ka25pdHI6OmthYmxlKHQod2l0aChjb2xEYXRhKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQpLCB0YWJsZShDZWxsX0N5Y2xlLCBkYXRhc2V0KSkpKQpgYGAKCiMgQmF0Y2ggY29ycmVjdGlvbiAoZm9yIHZpc3VhbGl6YXRpb24pCgojIyBNdXR1YWwgbmVhcmVzdCBuZWlnaGJvdXJzCgpNdXR1YWwgbmVhcmVzdCBuZWlnaGJvdXJzIGlzIGEgYmF0Y2ggY29ycmVjdGlvbiBtZXRob2QgdGhhdCBmaW5kcyBuZWFyZXN0IG5laWdoYm91cnMgYWNyb3NzIGJhdGNoZXMgdG8gY29ycmVjdCBvdGhlciBjZWxscyBieS4gCgpXZSBkb24ndCBoYXZlIHNwaWtlcyB0byB1c2UgaGVyZSwgc28gd2UncmUgbWFraW5nIGFuIGFzc3VtcHRpb24gdGhhdCBtb3N0IG5vaXNlIGlzIHRlY2huaWNhbCBldmVuIGZvciBlbmRvZ2Vub3VzIGdlbmVzLiAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KZml0IDwtIHRyZW5kVmFyKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQsIHBhcmFtZXRyaWM9VFJVRSwgdXNlLnNwaWtlcyA9IEZBTFNFLCBibG9jayA9IGZhY3RvcihzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkJGJhdGNoKSkKZGVjb21wIDwtIGRlY29tcG9zZVZhcihzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkLCBmaXQpCmRlY29tcCRTeW1ib2wgPC0gcm93RGF0YShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkKSRTeW1ib2wKCmRlY29tcF9jaG9zZW4gPC0gZGVjb21wICU+JSBzdWJzZXQoYmlvID4gMCkKY2hvc2VuIDwtIHJvd25hbWVzKGRlY29tcF9jaG9zZW4pCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQpzZXQuc2VlZCgxMDApIAoKYmF0Y2hlcyA8LSB1bmlxdWUoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCRiYXRjaCkKCmV4cHJfbWF0cmljZXMgPC0gbGFwcGx5KGJhdGNoZXMsIGZ1bmN0aW9uKGJhdCkgewogIHNjZV9zdWJzZXQgPC0gc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCAlPiUgc2NhdGVyOjpmaWx0ZXIoYmF0Y2ggPT0gYmF0KQogIG1hdCA8LSBhcy5tYXRyaXgobG9nY291bnRzKHNjZV9zdWJzZXQpW2Nob3NlbixdKQogIHJldHVybihtYXQpCn0pCgptbm4ub3V0IDwtIGRvLmNhbGwobW5uQ29ycmVjdCwgYyhleHByX21hdHJpY2VzLCBsaXN0KGs9MjAsIEJQUEFSQU0gPSBNdWx0aWNvcmVQYXJhbSgxNSkpKSkKYGBgCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQppbmRpY2VzIDwtIGxhcHBseShiYXRjaGVzLCBmdW5jdGlvbihiYXQpIHsKICBzY2Vfc3Vic2V0IDwtIHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQgJT4lIHNjYXRlcjo6ZmlsdGVyKGJhdGNoID09IGJhdCkKICBpZHggPC0gdW5uYW1lKHNhcHBseShjb2xEYXRhKHNjZV9zdWJzZXQpJHNhbXBsZV9iYXJjb2RlLCBmdW5jdGlvbih4KSB3aGljaChzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkJHNhbXBsZV9iYXJjb2RlID09IHgpKSkKICByZXR1cm4oaWR4KQp9KQoKZXhwcl9tYXRfY29tYmluZWRfbW5uIDwtIG1hdHJpeChOQSwgbnJvdyA9IG5yb3cobW5uLm91dCRjb3JyZWN0ZWRbWzFdXSksIG5jb2wgPSBsZW5ndGgodW5saXN0KGluZGljZXMpKSkKZm9yIChpIGluIHNlcV9hbG9uZyhpbmRpY2VzKSkgewogIGV4cHJfbWF0X2NvbWJpbmVkX21ublssaW5kaWNlc1tbaV1dXSA8LSBtbm4ub3V0JGNvcnJlY3RlZFtbaV1dCn0Kcm93bmFtZXMoZXhwcl9tYXRfY29tYmluZWRfbW5uKSA8LSByb3duYW1lcyhtbm4ub3V0JGNvcnJlY3RlZFtbMV1dKQoKc2NlX21ubiA8LSBTaW5nbGVDZWxsRXhwZXJpbWVudChhc3NheXMgPSBsaXN0KG1ubj1leHByX21hdF9jb21iaW5lZF9tbm4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEgPSBjb2xEYXRhKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQpKQoKc2NlX21ubiA8LSBydW5QQ0Eoc2NlX21ubiwgZXhwcnNfdmFsdWVzID0gIm1ubiIsIG50b3AgPSAxMDAwLCBuY29tcG9uZW50cyA9IDUwKQpzY2VfbW5uIDwtIHJ1blRTTkUoc2NlX21ubiwgdXNlX2RpbXJlZCA9ICJQQ0EiLCBuX2RpbXJlZCA9IDUwLCBuY29tcG9uZW50cyA9IDIpCnNjZV9tbm4gPC0gcnVuVU1BUChzY2VfbW5uLCBuY29tcG9uZW50cyA9IDIsIHVzZV9kaW1yZWQgPSAiUENBIiwgbl9kaW1yZWQgPSA1MCkKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpyZWR1Y2VkRGltKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQsICJQQ0FfbW5uIikgPC0gcmVkdWNlZERpbShzY2VfbW5uLCAiUENBIikKcmVkdWNlZERpbShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkLCAiVFNORV9tbm4iKSA8LSByZWR1Y2VkRGltKHNjZV9tbm4sICJUU05FIikKcmVkdWNlZERpbShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkLCAiVU1BUF9tbm4iKSA8LSByZWR1Y2VkRGltKHNjZV9tbm4sICJVTUFQIikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwbG90UmVkdWNlZERpbShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkLCB1c2VfZGltcmVkID0gIlRTTkVfbW5uIiwgbmNvbXBvbmVudHMgPSAyLCBjb2xvdXJfYnkgPSAiZGF0YXNldCIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KcGxvdFJlZHVjZWREaW0oc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCwgdXNlX2RpbXJlZCA9ICJVTUFQX21ubiIsIG5jb21wb25lbnRzID0gMiwgY29sb3VyX2J5ID0gImRhdGFzZXQiKQpgYGAKCiMgQ2VsbEFzc2lnbgoKIyMgQ29uc2VydmF0aXZlCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpmb2xsaWN1bGFyX21hcmtlcnMxIDwtIGxpc3QoCiAgJ0IgY2VsbHMnPWMoIkNEMTkiLCAiTVM0QTEiLCAiQ0Q3OUEiLCAiQ0Q3OUIiLCAiSUdLQyIsICJJR0xDMiIsICJJR0xDMyIsICJDRDc0IiksCiAgJ1QgY2VsbHMnPWMoIkNEM0QiLCAiQ0QzRSIsICJDRDNHIiwgIkNEMjgiLCAiVFJBQyIpLAogICdNeWVsb2lkJz1jKCJDRDE0IiwgIkNENjgiLCAiQ0QzMyIsICJDRDc0IiwgIkxZWiIsICJTMTAwQTkiLCAiUzEwMEE4IikKKQoKZm9sbGljdWxhcl9yaG8xIDwtIG1hcmtlcl9saXN0X3RvX21hdChmb2xsaWN1bGFyX21hcmtlcnMxLCBpbmNsdWRlX290aGVyID0gRkFMU0UpCmBgYAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAnYXNpcyd9CmtuaXRyOjprYWJsZShmb2xsaWN1bGFyX3JobzEpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KQiA8LSA0MApzIDwtIHNpemVGYWN0b3JzKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQpCnNjZSA8LSBzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkW2dldF9lbnNlbWJsX2lkKHJvd25hbWVzKGZvbGxpY3VsYXJfcmhvMSksIHJvd0RhdGEoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCkpLF0Kcm93bmFtZXMoc2NlKSA8LSByb3duYW1lcyhmb2xsaWN1bGFyX3JobzEpCmNvdW50cyhzY2UpIDwtIGFzLm1hdHJpeChjb3VudHMoc2NlKSkKCmNlbGxhc3NpZ25fcmVzIDwtIGNlbGxhc3NpZ25fZW0oZXhwcnNfb2JqID0gc2NlLCBzID0gcywgcmhvID0gZm9sbGljdWxhcl9yaG8xLCBYID0gTlVMTCwgQiA9IEIsIHVzZV9wcmlvcnMgPSBUUlVFLCBwcmlvcl90eXBlID0gInNocmlua2FnZSIsIGRlbHRhX3ZhcmlhbmNlX3ByaW9yID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSwgZW1fY29udmVyZ2VuY2VfdGhyZXMgPSAxZS01LCBudW1fcnVucyA9IDEsIG1pbl9kZWx0YSA9IGxvZygyKSkKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gRkFMU0V9CnNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZCA8LSBzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkCgpzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkX2xhYmVsZWQkY2VsbGFzc2lnbl9jbHVzdGVyIDwtIGZhY3RvcihjZWxsYXNzaWduX3JlcyRjZWxsX3R5cGUpCnNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZEBjb2xEYXRhIDwtIGJpbmRfY29scyhzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkX2xhYmVsZWRAY29sRGF0YSAlPiUgYXMuZGF0YS5mcmFtZSwgYXMuZGF0YS5mcmFtZShjZWxsYXNzaWduX3JlcyRtbGVfcGFyYW1zJGdhbW1hKSkgJT4lIERhdGFGcmFtZShjaGVjay5uYW1lcyA9IEZBTFNFKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICc3NSUnfQpwbG90UENBKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZCwgbmNvbXBvbmVudHMgPSAyLCBjb2xvdXJfYnkgPSAiY2VsbGFzc2lnbl9jbHVzdGVyIikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAnNzUlJ30KcGxvdFRTTkUoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkLCBuY29tcG9uZW50cyA9IDIsIGNvbG91cl9ieSA9ICJjZWxsYXNzaWduX2NsdXN0ZXIiKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAnYXNpcyd9CmtuaXRyOjprYWJsZSh0KHRhYmxlKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZCRjZWxsYXNzaWduX2NsdXN0ZXIpKSkKYGBgCgojIyMgVC1jZWxsIHN1YmNsdXN0ZXJpbmcKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmNlbGx0eXBlX3Byb2JfdGhyZXNob2xkIDwtIDAuOQoKc2NlX3RfY2VsbHMgPC0gc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkICU+JSAKICBzY2F0ZXI6OmZpbHRlcihULmNlbGxzID49IGNlbGx0eXBlX3Byb2JfdGhyZXNob2xkKQoKc2NlX3RfY2VsbHMgPC0gcnVuUENBKHNjZV90X2NlbGxzLCBudG9wID0gMTAwMCwgbmNvbXBvbmVudHMgPSA1MCkKc2NlX3RfY2VsbHMgPC0gcnVuVFNORShzY2VfdF9jZWxscywgbmNvbXBvbmVudHMgPSAyLCB1c2VfZGltcmVkID0gIlBDQSIsIG5fZGltcmVkID0gNTApCgpzY2VfbW5uX3QgPC0gc2NlX21ublssc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkJGBUIGNlbGxzYCA+PSAwLjldCgpzY2VfbW5uX3QgPC0gcnVuUENBKHNjZV9tbm5fdCwgbnRvcCA9IDEwMDAsIG5jb21wb25lbnRzID0gNTAsIGV4cHJzX3ZhbHVlcyA9ICJtbm4iKQpzY2VfbW5uX3QgPC0gcnVuVFNORShzY2VfbW5uX3QsIG5jb21wb25lbnRzID0gMiwgdXNlX2RpbXJlZCA9ICJQQ0EiLCBuX2RpbXJlZCA9IDUwKQpzY2VfbW5uX3QgPC0gcnVuVU1BUChzY2VfbW5uX3QsIG5jb21wb25lbnRzID0gMiwgdXNlX2RpbXJlZCA9ICJQQ0EiLCBuX2RpbXJlZCA9IDUwKQoKcmVkdWNlZERpbShzY2VfdF9jZWxscywgIlBDQV9tbm4iKSA8LSByZWR1Y2VkRGltKHNjZV9tbm5fdCwgIlBDQSIpCnJlZHVjZWREaW0oc2NlX3RfY2VsbHMsICJUU05FX21ubiIpIDwtIHJlZHVjZWREaW0oc2NlX21ubl90LCAiVFNORSIpCnJlZHVjZWREaW0oc2NlX3RfY2VsbHMsICJVTUFQX21ubiIpIDwtIHJlZHVjZWREaW0oc2NlX21ubl90LCAiVU1BUCIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQpzY2VfdF9jZWxscyA8LSBjbHVzdGVyX3dyYXBwZXIoc2NlX3RfY2VsbHMsIGdlbmVfc3Vic2V0ID0gTlVMTCwgZGltcmVkdWNlX21ldGhvZCA9ICJQQ0FfbW5uIiwgY2x1c3RlcmluZ19tZXRob2QgPSAicGhlbm9ncmFwaCIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gJzc1JSd9CnBsb3RSZWR1Y2VkRGltKHNjZV90X2NlbGxzLCB1c2VfZGltcmVkID0gIlRTTkVfbW5uIiwgY29sb3VyX2J5ID0gImRhdGFzZXQiKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICc3NSUnfQpwbG90UmVkdWNlZERpbShzY2VfdF9jZWxscywgdXNlX2RpbXJlZCA9ICJUU05FX21ubiIsIGNvbG91cl9ieSA9ICJjbHVzdGVyIikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQptYXJrZXJfdGFibGVzIDwtIGZpbmRNYXJrZXJzKHNjZV90X2NlbGxzLCBjbHVzdGVycyA9IHNjZV90X2NlbGxzJGNsdXN0ZXIsIGRpcmVjdGlvbiA9ICJ1cCIpCgptYXJrZXJfdGFibGVzIDwtIGxhcHBseShtYXJrZXJfdGFibGVzLCBmdW5jdGlvbih4KSB7CiAgeCA8LSB4ICU+JSAKICAgIGFzLmRhdGEuZnJhbWUgJT4lCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiSUQiKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoU3ltYm9sPWRmX2FzX21hcChyb3dEYXRhKHNjZV90X2NlbGxzKSAlPiUgYXMuZGF0YS5mcmFtZSwgSUQsIGZyb20gPSAiSUQiLCB0byA9ICJTeW1ib2wiKSkKICByZXR1cm4oeCkKfSkKYGBgCgojIyBGdWxsCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpmb2xsaWN1bGFyX21hcmtlcnMyIDwtIGxpc3QoCiAgJ0IgY2VsbHMnPWMoIkNEMTkiLCAiTVM0QTEiLCAiQ0Q3OUEiLCAiQ0Q3OUIiLCAiSUdLQyIsICJJR0xDMiIsICJJR0xDMyIsICJDRDc0IiwgIlNFTEwiLCAiQ0NSNyIsICJDWENSNSIpLAogICdUYzEnPWMoIkNEMiIsICJDRDNEIiwgIkNEM0UiLCAiQ0QzRyIsICJUUkFDIiwgIkNEOEEiLCAiQ0Q4QiIsICJHWk1BIiwgIkdaTUsiLCAiTktHNyIsICJDQ0w1IiwgIkVPTUVTIiwgIklGTkciKSwKICAnVGMyJz1jKCJDRDIiLCAiQ0QzRCIsICJDRDNFIiwgIkNEM0ciLCAiVFJBQyIsICJDRDhBIiwgIkNEOEIiLCAiR1pNQSIsICJHWk1LIiwgIk5LRzciLCAiQ0NMNSIsICJFT01FUyIpLAogICdOYWl2ZS9DTSBDRDQnPWMoIkNEMiIsICJDRDNEIiwgIkNEM0UiLCAiQ0QzRyIsICJUUkFDIiwgIkNENCIsICJTRUxMIiwgIkNDUjciLCAiVENGNyIpLAogICdUIHJlZ3MnPWMoIkNEMiIsICJDRDNEIiwgIkNEM0UiLCAiQ0QzRyIsICJUUkFDIiwgIkNENCIsICJGT1hQMyIsICJJTDJSQSIsICJUTkZSU0Y0IiksCiAgJ1RmaCc9YygiQ0QyIiwgIkNEM0QiLCAiQ0QzRSIsICJDRDNHIiwgIlRSQUMiLCAiQ0Q0IiwgIkNYQ1I1IiwgIlBEQ0QxIiwgIlRDRjciLCAiQ1hDTDEzIiwgIlRORlJTRjQiLCAiU1Q4U0lBMSIpLCAjIFNUOFNJQTEgdmVyeSBzcGVjaWZpYyBhY2NvcmRpbmcgdG8gTE0yMgogICdNeWVsb2lkJz1jKCJDRDE0IiwgIkNENjgiLCAiQ0QzMyIsICJDRDc0IiwgIkxZWiIsICJTMTAwQTkiLCAiUzEwMEE4IiwgIkNENCIpLAogICdUIGdhbW1hIGRlbHRhJz1jKCJDRDIiLCAiQ0QzRCIsICJDRDNFIiwgIkNEM0ciLCAiVFJEQyIsICJOS0c3IiwgIkdOTFkiLCAiQ0NMNSIsICJHWk1BIiksCiAgJ0NEOCBtZW1vcnkvVGMxNyc9YygiQ0QyIiwgIkNEM0QiLCAiQ0QzRSIsICJDRDNHIiwgIlRSQUMiLCAiQ0Q4QSIsICJDRDhCIiwgIkNDTDUiLCAiS0xSQjEiKSwKICAnVGgxNyc9YygiQ0QyIiwgIkNEM0QiLCAiQ0QzRSIsICJDRDNHIiwgIlRSQUMiLCAiQ0Q0IiwgIktMUkIxIiwgIlRORlJTRjQiKSwKICAnVF9vdGhlcic9YygiQ0QyIiwgIkNEM0QiLCAiQ0QzRSIsICJDRDNHIiwgIlRSQUMiKQogICMgVCBnYW1tYSBkZWx0YSAtLSBUUkRDCiAgIyBLTFJCMS1leHByZXNzaW5nIGNsdXN0ZXIgKENENCBtZW1vcnkgVCBjZWxscz8/IGNoZWNrIGxpdGVyYXR1cmUpICMjIEtMUkIxID09IENEMTYxCiAgIyBLTFJCMS1leHByZXNzaW5nIENDTDUgYW5kIENEOCBjbHVzdGVyPwogICMgQ0Q4IGFjdGl2YXRlZCAtLSBDRDY5IGFuZCBJRk5HCikgIyBDRDI4IGluIFQgY2VsbHMgLS0gYnV0IERFJ2QgYmV0d2VlbiBkaWZmZXJlbnQgc3Vic2V0cwojIHdoYXQgZG9lcyB0aGUgQ0Q2OSBtZWFuPwoKIyBQMlJYNSBpbiBUZmggYW5kIEIgY2VsbHMKCmZvbGxpY3VsYXJfcmhvMiA8LSBtYXJrZXJfbGlzdF90b19tYXQoZm9sbGljdWxhcl9tYXJrZXJzMiwgaW5jbHVkZV9vdGhlciA9IFRSVUUpCmBgYAoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAnYXNpcyd9CmtuaXRyOjprYWJsZShmb2xsaWN1bGFyX3JobzIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KQiA8LSA0MApzIDwtIHNpemVGYWN0b3JzKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWQpCnNjZSA8LSBzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkW2dldF9lbnNlbWJsX2lkKHJvd25hbWVzKGZvbGxpY3VsYXJfcmhvMiksIHJvd0RhdGEoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZCkpLF0Kcm93bmFtZXMoc2NlKSA8LSByb3duYW1lcyhmb2xsaWN1bGFyX3JobzIpCmNvdW50cyhzY2UpIDwtIGFzLm1hdHJpeChjb3VudHMoc2NlKSkKCiMgQUREIFBBVElFTlQtU1BFQ0lGSUMgQ09NUE9ORU5UIFRPIERFU0lHTiBNQVRSSVgKCmNlbGxhc3NpZ25fcmVzX2Z1bGwgPC0gY2VsbGFzc2lnbl9lbShleHByc19vYmogPSBzY2UsIHMgPSBzLCByaG8gPSBmb2xsaWN1bGFyX3JobzIsIFggPSBOVUxMLCBCID0gQiwgdXNlX3ByaW9ycyA9IFRSVUUsIHByaW9yX3R5cGUgPSAic2hyaW5rYWdlIiwgZGVsdGFfdmFyaWFuY2VfcHJpb3IgPSBGQUxTRSwgdmVyYm9zZSA9IEZBTFNFLCBlbV9jb252ZXJnZW5jZV90aHJlcyA9IDFlLTUsIG51bV9ydW5zID0gMSwgbWluX2RlbHRhID0gbG9nKDIpKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0Kc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwgPC0gc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZAoKc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwkY2VsbGFzc2lnbl9jbHVzdGVyIDwtIGZhY3RvcihjZWxsYXNzaWduX3Jlc19mdWxsJGNlbGxfdHlwZSkKc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGxAY29sRGF0YSA8LSBiaW5kX2NvbHMoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGxAY29sRGF0YSAlPiUgYXMuZGF0YS5mcmFtZSwgYXMuZGF0YS5mcmFtZShjZWxsYXNzaWduX3Jlc19mdWxsJG1sZV9wYXJhbXMkZ2FtbWEpKSAlPiUgRGF0YUZyYW1lKGNoZWNrLm5hbWVzID0gRkFMU0UpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoID0gJzc1JSd9CnBsb3RUU05FKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZF9mdWxsLCBuY29tcG9uZW50cyA9IDIsIGNvbG91cl9ieSA9ICJjZWxsYXNzaWduX2NsdXN0ZXIiKQpgYGAKCiMjIyBQcm9iYWJpbGl0aWVzCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwaCA8LSBwbG90X2dhbW1hX2hlYXRtYXAoY2VsbGFzc2lnbl9yZXNfZnVsbCwgc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwsIHN0cmF0aWZpZWQgPSBGQUxTRSwgbl9zYW1wbGUgPSAzMDAwKQoKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHBoKQpgYGAKCiMjIyBNYXRjaCB0byB1bnN1cGVydmlzZWQgY2x1c3RlcnMKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmNlbGxhc3NpZ25fY29scyA8LSBjKCJjZWxsYXNzaWduX2NsdXN0ZXIiLCBjb2xuYW1lcyhmb2xsaWN1bGFyX3JobzIpKQpjZWxsYXNzaWduX3RhYiA8LSBjb2xEYXRhKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZF9mdWxsKSAlPiUKICBkYXRhLmZyYW1lKGNoZWNrLm5hbWVzID0gRkFMU0UpICU+JQogIGRwbHlyOjpzZWxlY3QoYygic2FtcGxlX2JhcmNvZGUiLCBjZWxsYXNzaWduX2NvbHMpKSAlPiUKICBkcGx5cjo6cmVuYW1lKGNlbGxhc3NpZ25fY2x1c3Rlcl9mdWxsPWNlbGxhc3NpZ25fY2x1c3RlcikKCnNjZV90X2NlbGxzX2xhYmVsZWQgPC0gc2NlX3RfY2VsbHMKY29sRGF0YShzY2VfdF9jZWxsc19sYWJlbGVkKSA8LSBjb2xEYXRhKHNjZV90X2NlbGxzKSAlPiUKICBkYXRhLmZyYW1lKGNoZWNrLm5hbWVzID0gRkFMU0UpICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oY2VsbGFzc2lnbl90YWIsIGJ5ID0gInNhbXBsZV9iYXJjb2RlIikgJT4lCiAgRGF0YUZyYW1lKGNoZWNrLm5hbWVzID0gRkFMU0UpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KcGxvdFJlZHVjZWREaW0oc2NlX3RfY2VsbHNfbGFiZWxlZCwgdXNlX2RpbXJlZCA9ICJUU05FX21ubiIsIGNvbG91cl9ieSA9ICJjbHVzdGVyIikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwbG90UmVkdWNlZERpbShzY2VfdF9jZWxsc19sYWJlbGVkLCB1c2VfZGltcmVkID0gIlRTTkVfbW5uIiwgY29sb3VyX2J5ID0gImNlbGxhc3NpZ25fY2x1c3Rlcl9mdWxsIikKYGBgCgojIE1hbGlnbmFudCB2cy4gbm9ubWFsaWduYW50IEIgY2VsbCBpZGVudGlmaWNhdGlvbgoKYGBge3IsIGVjaG8gPSBGQUxTRX0Kc2NlX2JfY2VsbHMgPC0gc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkICU+JSAKICBzY2F0ZXI6OmZpbHRlcihCLmNlbGxzID49IGNlbGx0eXBlX3Byb2JfdGhyZXNob2xkKQoKc2NlX2JfY2VsbHMgPC0gcnVuUENBKHNjZV9iX2NlbGxzLCBudG9wID0gMTAwMCwgbmNvbXBvbmVudHMgPSA1MCkKc2NlX2JfY2VsbHMgPC0gcnVuVFNORShzY2VfYl9jZWxscywgbmNvbXBvbmVudHMgPSAyLCB1c2VfZGltcmVkID0gIlBDQSIsIG5fZGltcmVkID0gNTApCgpzY2VfbW5uX2IgPC0gc2NlX21ublssc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkJGBCIGNlbGxzYCA+PSAwLjldCgpzY2VfbW5uX2IgPC0gcnVuUENBKHNjZV9tbm5fYiwgbnRvcCA9IDEwMDAsIG5jb21wb25lbnRzID0gNTAsIGV4cHJzX3ZhbHVlcyA9ICJtbm4iKQpzY2VfbW5uX2IgPC0gcnVuVFNORShzY2VfbW5uX2IsIG5jb21wb25lbnRzID0gMiwgdXNlX2RpbXJlZCA9ICJQQ0EiLCBuX2RpbXJlZCA9IDUwKQoKcmVkdWNlZERpbShzY2VfYl9jZWxscywgIlBDQV9tbm4iKSA8LSByZWR1Y2VkRGltKHNjZV9tbm5fYiwgIlBDQSIpCnJlZHVjZWREaW0oc2NlX2JfY2VsbHMsICJUU05FX21ubiIpIDwtIHJlZHVjZWREaW0oc2NlX21ubl9iLCAiVFNORSIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KcGxvdFJlZHVjZWREaW0oc2NlX2JfY2VsbHMsIHVzZV9kaW1yZWQgPSAiVFNORV9tbm4iLCBjb2xvdXJfYnkgPSAiZGF0YXNldCIpCmBgYAoKIyMgUGF0aWVudC1ieS1wYXRpZW50IGFuYWx5c2lzCgojIyMgRkwxMDA0CgpgYGB7ciwgZWNobyA9IEZBTFNFfQpzY2VfRkwxMDA0X0IgPC0gc2NlX2JfY2VsbHMgJT4lIAogIHNjYXRlcjo6ZmlsdGVyKHBhdGllbnQgPT0gIkZMMTAwNCIpCgojIFRoaXMgZG9lcyB3YXkgYmV0dGVyIHRoYW4gcnVubmluZyBQQ0EgKyBUU05FIGFnYWluIChvbiB0aGUgbm9uLU1OTiBkYXRhKQpwbG90UmVkdWNlZERpbShzY2VfRkwxMDA0X0IsIG5jb21wb25lbnRzID0gMiwgdXNlX2RpbXJlZCA9ICJUU05FX21ubiIsIGNvbG91cl9ieSA9ICJkYXRhc2V0IikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpzZXQuc2VlZCgxMDEpCnNjZV9GTDEwMDRfQiA8LSBjbHVzdGVyX3dyYXBwZXIoc2NlX0ZMMTAwNF9CLCBnZW5lX3N1YnNldCA9IE5VTEwsIGRpbXJlZHVjZV9tZXRob2QgPSAiUENBX21ubiIsIGNsdXN0ZXJpbmdfbWV0aG9kID0gInBoZW5vZ3JhcGgiKQoKcGxvdFJlZHVjZWREaW0oc2NlX0ZMMTAwNF9CLCBuY29tcG9uZW50cyA9IDIsIHVzZV9kaW1yZWQgPSAiVFNORV9tbm4iLCBjb2xvdXJfYnkgPSAiY2x1c3RlciIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0Kbm9ubWFsaWduYW50X2NsdXN0ZXJzIDwtIGMoIjMiKQoKRkwxMDA0X0JfbWFwcGluZyA8LSBjb2xEYXRhKHNjZV9GTDEwMDRfQikgJT4lCiAgZGF0YS5mcmFtZShjaGVjay5uYW1lcyA9IEZBTFNFKSAlPiUKICBkcGx5cjo6c2VsZWN0KHNhbXBsZV9iYXJjb2RlLCBjbHVzdGVyKSAlPiUKICBkcGx5cjo6bXV0YXRlKG1hbGlnbmFudF9zdGF0dXNfbWFudWFsPWlmZWxzZShjbHVzdGVyICVpbiUgbm9ubWFsaWduYW50X2NsdXN0ZXJzLCAibm9ubWFsaWduYW50IiwgIm1hbGlnbmFudCIpKQpgYGAKCiMjIyBGTDEwMTIKCmBgYHtyLCBlY2hvID0gRkFMU0V9CnNjZV9GTDEwMTJfQiA8LSBzY2VfYl9jZWxscyAlPiUgCiAgc2NhdGVyOjpmaWx0ZXIocGF0aWVudCA9PSAiRkwxMDEyIikKCnNldC5zZWVkKDEwMSkKc2NlX0ZMMTAxMl9CIDwtIGNsdXN0ZXJfd3JhcHBlcihzY2VfRkwxMDEyX0IsIGdlbmVfc3Vic2V0ID0gTlVMTCwgZGltcmVkdWNlX21ldGhvZCA9ICJQQ0FfbW5uIiwgY2x1c3RlcmluZ19tZXRob2QgPSAicGhlbm9ncmFwaCIpCgpwbG90UmVkdWNlZERpbShzY2VfRkwxMDEyX0IsIG5jb21wb25lbnRzID0gMiwgdXNlX2RpbXJlZCA9ICJUU05FX21ubiIsIGNvbG91cl9ieSA9ICJkYXRhc2V0IikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwbG90UmVkdWNlZERpbShzY2VfRkwxMDEyX0IsIG5jb21wb25lbnRzID0gMiwgdXNlX2RpbXJlZCA9ICJUU05FX21ubiIsIGNvbG91cl9ieSA9ICJjbHVzdGVyIikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpub25tYWxpZ25hbnRfY2x1c3RlcnMgPC0gYygiMiIsICI3IiwgIjExIikKCkZMMTAxMl9CX21hcHBpbmcgPC0gY29sRGF0YShzY2VfRkwxMDEyX0IpICU+JQogIGRhdGEuZnJhbWUoY2hlY2submFtZXMgPSBGQUxTRSkgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVfYmFyY29kZSwgY2x1c3RlcikgJT4lCiAgZHBseXI6Om11dGF0ZShtYWxpZ25hbnRfc3RhdHVzX21hbnVhbD1pZmVsc2UoY2x1c3RlciAlaW4lIG5vbm1hbGlnbmFudF9jbHVzdGVycywgIm5vbm1hbGlnbmFudCIsICJtYWxpZ25hbnQiKSkKYGBgCgoKIyMjIEZMMTAxOAoKYGBge3IsIGVjaG8gPSBGQUxTRX0Kc2NlX0ZMMTAxOF9CIDwtIHNjZV9iX2NlbGxzICU+JSAKICBzY2F0ZXI6OmZpbHRlcihwYXRpZW50ID09ICJGTDEwMTgiKQoKc2V0LnNlZWQoMTAxKQpzY2VfRkwxMDE4X0IgPC0gY2x1c3Rlcl93cmFwcGVyKHNjZV9GTDEwMThfQiwgZ2VuZV9zdWJzZXQgPSBOVUxMLCBkaW1yZWR1Y2VfbWV0aG9kID0gIlBDQV9tbm4iLCBjbHVzdGVyaW5nX21ldGhvZCA9ICJwaGVub2dyYXBoIikKCnBsb3RSZWR1Y2VkRGltKHNjZV9GTDEwMThfQiwgbmNvbXBvbmVudHMgPSAyLCB1c2VfZGltcmVkID0gIlRTTkVfbW5uIiwgY29sb3VyX2J5ID0gImRhdGFzZXQiKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0V9CnBsb3RSZWR1Y2VkRGltKHNjZV9GTDEwMThfQiwgbmNvbXBvbmVudHMgPSAyLCB1c2VfZGltcmVkID0gIlRTTkVfbW5uIiwgY29sb3VyX2J5ID0gImNsdXN0ZXIiKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0V9Cm5vbm1hbGlnbmFudF9jbHVzdGVycyA8LSBjKCI4IikKCkZMMTAxOF9CX21hcHBpbmcgPC0gY29sRGF0YShzY2VfRkwxMDE4X0IpICU+JQogIGRhdGEuZnJhbWUoY2hlY2submFtZXMgPSBGQUxTRSkgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVfYmFyY29kZSwgY2x1c3RlcikgJT4lCiAgZHBseXI6Om11dGF0ZShtYWxpZ25hbnRfc3RhdHVzX21hbnVhbD1pZmVsc2UoY2x1c3RlciAlaW4lIG5vbm1hbGlnbmFudF9jbHVzdGVycywgIm5vbm1hbGlnbmFudCIsICJtYWxpZ25hbnQiKSkKYGBgCgojIyMgRkwyMDAxCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpzY2VfRkwyMDAxX0IgPC0gc2NlX2JfY2VsbHMgJT4lIAogIHNjYXRlcjo6ZmlsdGVyKHBhdGllbnQgPT0gIkZMMjAwMSIpCgpzZXQuc2VlZCgxMDEpCnNjZV9GTDIwMDFfQiA8LSBjbHVzdGVyX3dyYXBwZXIoc2NlX0ZMMjAwMV9CLCBnZW5lX3N1YnNldCA9IE5VTEwsIGRpbXJlZHVjZV9tZXRob2QgPSAiUENBX21ubiIsIGNsdXN0ZXJpbmdfbWV0aG9kID0gInBoZW5vZ3JhcGgiKQoKcGxvdFJlZHVjZWREaW0oc2NlX0ZMMjAwMV9CLCBuY29tcG9uZW50cyA9IDIsIHVzZV9kaW1yZWQgPSAiVFNORV9tbm4iLCBjb2xvdXJfYnkgPSAiZGF0YXNldCIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KcGxvdFJlZHVjZWREaW0oc2NlX0ZMMjAwMV9CLCBuY29tcG9uZW50cyA9IDIsIHVzZV9kaW1yZWQgPSAiVFNORV9tbm4iLCBjb2xvdXJfYnkgPSAiY2x1c3RlciIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0Kbm9ubWFsaWduYW50X2NsdXN0ZXJzIDwtIGMoIjIiLCAiOSIpCgpGTDIwMDFfQl9tYXBwaW5nIDwtIGNvbERhdGEoc2NlX0ZMMjAwMV9CKSAlPiUKICBkYXRhLmZyYW1lKGNoZWNrLm5hbWVzID0gRkFMU0UpICU+JQogIGRwbHlyOjpzZWxlY3Qoc2FtcGxlX2JhcmNvZGUsIGNsdXN0ZXIpICU+JQogIGRwbHlyOjptdXRhdGUobWFsaWduYW50X3N0YXR1c19tYW51YWw9aWZlbHNlKGNsdXN0ZXIgJWluJSBub25tYWxpZ25hbnRfY2x1c3RlcnMsICJub25tYWxpZ25hbnQiLCAibWFsaWduYW50IikpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KQl9tYXBwaW5nIDwtIGRvLmNhbGwocmJpbmQsCiAgICAgICAgICAgICAgICAgICAgIGxpc3QoRkwxMDA0X0JfbWFwcGluZywgRkwxMDEyX0JfbWFwcGluZywgRkwxMDE4X0JfbWFwcGluZywgRkwyMDAxX0JfbWFwcGluZykpCgpjb2xEYXRhKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZCkgPC0gY29sRGF0YShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkX2xhYmVsZWQpICU+JQogIGRhdGEuZnJhbWUoY2hlY2submFtZXMgPSBGQUxTRSkgJT4lCiAgZHBseXI6OmxlZnRfam9pbihCX21hcHBpbmcgJT4lIGRwbHlyOjpzZWxlY3QoLWMoY2x1c3RlcikpKSAlPiUKICBEYXRhRnJhbWUKCmNvbERhdGEoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwpIDwtIGNvbERhdGEoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwpICU+JQogIGRhdGEuZnJhbWUoY2hlY2submFtZXMgPSBGQUxTRSkgJT4lCiAgZHBseXI6OmxlZnRfam9pbihCX21hcHBpbmcgJT4lIGRwbHlyOjpzZWxlY3QoLWMoY2x1c3RlcikpKSAlPiUKICBEYXRhRnJhbWUKCmNvbERhdGEoc2NlX2JfY2VsbHMpIDwtIGNvbERhdGEoc2NlX2JfY2VsbHMpICU+JQogIGRhdGEuZnJhbWUoY2hlY2submFtZXMgPSBGQUxTRSkgJT4lCiAgZHBseXI6OmxlZnRfam9pbihCX21hcHBpbmcgJT4lIGRwbHlyOjpzZWxlY3QoLWMoY2x1c3RlcikpKSAlPiUKICBEYXRhRnJhbWUKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwbG90UmVkdWNlZERpbShzY2VfYl9jZWxscywgdXNlX2RpbXJlZCA9ICJUU05FX21ubiIsIGNvbG91cl9ieSA9ICJtYWxpZ25hbnRfc3RhdHVzX21hbnVhbCIpCmBgYAoKCiMgUHJvcG9ydGlvbnMgYW5kIGRpZmZlcmVudGlhbCBleHByZXNzaW9uCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpjb21wdXRlX2NlbGx0eXBlX3Byb3BvcnRpb25zIDwtIGZ1bmN0aW9uKHNjZSwgY2VsbHR5cGVfY29sID0gImNlbGxhc3NpZ25fY2x1c3RlciIpIHsKICBjZWxsdHlwZV9jb3VudHMgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShjb2xEYXRhKHNjZSlbLCJkYXRhc2V0Il0sIGNvbERhdGEoc2NlKVssY2VsbHR5cGVfY29sXSkpICU+JQogICAgZHBseXI6OnJlbmFtZShkYXRhc2V0PVZhcjEsIGNlbGx0eXBlPVZhcjIsIGNvdW50PUZyZXEpICU+JQogICAgZHBseXI6Omdyb3VwX2J5KGRhdGFzZXQpICU+JQogICAgZHBseXI6Om11dGF0ZShwcm9wb3J0aW9uPWNvdW50L3N1bShjb3VudCkpICU+JQogICAgZHBseXI6OnVuZ3JvdXAoKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoY2VsbHR5cGU9cGFzdGUwKGNlbGx0eXBlLCAiIChzY3JuYSkiKSkKICAKICBkZiA8LSByZXNoYXBlMjo6ZGNhc3QoY2VsbHR5cGVfY291bnRzLCBmb3JtdWxhID0gZGF0YXNldCB+IGNlbGx0eXBlLCB2YWx1ZS52YXIgPSAicHJvcG9ydGlvbiIpCiAgCiAgcmV0dXJuKGRmKQp9CmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0Kc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwkY2VsbHR5cGUgPC0gc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwkY2VsbGFzc2lnbl9jbHVzdGVyCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0Kc2NybmFfcHJvcCA8LSBjb21wdXRlX2NlbGx0eXBlX3Byb3BvcnRpb25zKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZF9mdWxsLCBjZWxsdHlwZV9jb2wgPSAiY2VsbHR5cGUiKQpgYGAKCmBgYHtyLCBlY2hvID0gRkFMU0V9CmdhZ2VfYW5hbHlzaXMgPC0gZnVuY3Rpb24oc2NlLCBjb21wYXJpc29uX3R5cGUgPSAidGltZXBvaW50IiwgZmlsdGVyX3JpYm8gPSBUUlVFLCBmaWx0ZXJfbWl0byA9IFRSVUUsIGdlbmVfc2V0X3BhdGgsIHJvd2RhdCkgewogIGlmIChjb21wYXJpc29uX3R5cGUgPT0gInRpbWVwb2ludCIpIHsKICAgIGRlX3RhYmxlIDwtIGZpbmRNYXJrZXJzKHNjZSwgY2x1c3RlcnMgPSBzY2UkdGltZXBvaW50LCBibG9jayA9IGZhY3RvcihzY2UkcGF0aWVudCkpCiAgICBkZV90YWJsZSA8LSBhZGRfc3ltYm9sKGRlX3RhYmxlLCBmaWx0ZXJfbWl0byA9IGZpbHRlcl9taXRvLCBmaWx0ZXJfcmlibyA9IGZpbHRlcl9yaWJvLCByb3dkYXQpCiAgICAKICAgIGRmIDwtIGRlX3RhYmxlJFQyCiAgICBmY3ZhbHMgPC0gZGYkbG9nRkMuVDEKICB9IGVsc2UgaWYgKGNvbXBhcmlzb25fdHlwZSA9PSAibWFsaWduYW50IikgewogICAgc2NlIDwtIHNjZSAlPiUgc2NhdGVyOjpmaWx0ZXIobWFsaWduYW50X3N0YXR1cyAlaW4lIGMoIm1hbGlnbmFudCIsICJub25tYWxpZ25hbnQiKSkKICAgIAogICAgZGVfdGFibGUgPC0gZmluZE1hcmtlcnMoc2NlLCBjbHVzdGVycyA9IHNjZSRtYWxpZ25hbnRfc3RhdHVzLCBibG9jayA9IGZhY3RvcihzY2UkcGF0aWVudCkpCiAgICBkZV90YWJsZSA8LSBhZGRfc3ltYm9sKGRlX3RhYmxlLCBmaWx0ZXJfbWl0byA9IGZpbHRlcl9taXRvLCBmaWx0ZXJfcmlibyA9IGZpbHRlcl9yaWJvLCByb3dkYXQpCiAgICAKICAgIGRmIDwtIGRlX3RhYmxlJG1hbGlnbmFudAogICAgZmN2YWxzIDwtIGRmJGxvZ0ZDLm5vbm1hbGlnbmFudAogIH0gZWxzZSB7CiAgICBzdG9wKCJPdGhlciBjb21wYXJpc29ucyBub3QgaW1wbGVtZW50ZWQuIikKICB9CiAgbmFtZXMoZmN2YWxzKSA8LSBkZiRTeW1ib2wKICAKICBncyA8LSBnYWdlOjpyZWFkTGlzdChnZW5lX3NldF9wYXRoKQogIAogIHJlcyA8LSBnYWdlOjpnYWdlKGZjdmFscywgZ3NldHMgPSBncywgcmVmID0gTlVMTCwgc2FtcCA9IE5VTEwpCiAgbWVhbl9mY3ZhbHMgPC0gc2FwcGx5KGdzLCBmdW5jdGlvbih4KSBtZWFuKGZjdmFsc1t4XSwgbmEucm0gPSBUUlVFKSkKICAKICBtZWFuX2ZjdmFsX2RmIDwtIGRhdGEuZnJhbWUocGF0aHdheT1uYW1lcyhtZWFuX2ZjdmFscyksIG1lYW5fbG9nRkM9dW5uYW1lKG1lYW5fZmN2YWxzKSkKICAKICByZXNfZyA8LSBkYXRhLmZyYW1lKHN1YnNldChhcy5kYXRhLmZyYW1lKHJlcyRncmVhdGVyKSwgc3RhdC5tZWFuID4gMCkgJT4lIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJwYXRod2F5IiksIHR5cGUgPSAiZ3JlYXRlciIpCiAgcmVzX2wgPC0gZGF0YS5mcmFtZShzdWJzZXQoYXMuZGF0YS5mcmFtZShyZXMkbGVzcyksIHN0YXQubWVhbiA8IDApICU+JSB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAicGF0aHdheSIpLCB0eXBlID0gImxlc3MiKQogIAogIHJlc19jb21iaW5lZCA8LSByYmluZChyZXNfZywgcmVzX2wpCiAgCiAgcmVzX2NvbWJpbmVkIDwtIHBseXI6OmpvaW4ocmVzX2NvbWJpbmVkLCBtZWFuX2ZjdmFsX2RmKQogIAogIHJldHVybihsaXN0KGdlbmVzPWRmLCBwYXRod2F5cz1yZXNfY29tYmluZWQpKQp9CgphZGRfc3ltYm9sIDwtIGZ1bmN0aW9uKGRlX3Jlc3VsdCwgZmlsdGVyX3JpYm8gPSBUUlVFLCBmaWx0ZXJfbWl0byA9IFRSVUUsIHJvd2RhdCkgewogIGRlX3Jlc3VsdCA8LSBsYXBwbHkoZGVfcmVzdWx0LCBmdW5jdGlvbih4KSB7CiAgICB4JFN5bWJvbCA8LSBkZl9hc19tYXAocm93ZGF0LCByb3duYW1lcyh4KSwgZnJvbSA9ICJJRCIsIHRvID0gIlN5bWJvbCIpCiAgICBpZiAoZmlsdGVyX3JpYm8pIHsKICAgICAgeCA8LSBzdWJzZXQoeCwgIXN0cl9kZXRlY3QoU3ltYm9sLCAiXlJQIikpCiAgICB9CiAgICBpZiAoZmlsdGVyX21pdG8pIHsKICAgICAgeCA8LSBzdWJzZXQoeCwgIXN0cl9kZXRlY3QoU3ltYm9sLCAiXk1UIikpCiAgICB9CiAgICByZXR1cm4oeCkKICB9KQogIHJldHVybihkZV9yZXN1bHQpCn0KYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpmaWx0ZXJfcmlibyA8LSBUUlVFCmZpbHRlcl9taXRvIDwtIFRSVUUKCnBhdGh3YXlfdGltZXBvaW50X3RmaCA8LSBnYWdlX2FuYWx5c2lzKHNjZSA9IHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZF9mdWxsICU+JSBzY2F0ZXI6OmZpbHRlcihjZWxsdHlwZSA9PSAiVGZoIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbl90eXBlID0gInRpbWVwb2ludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfcmlibyA9IGZpbHRlcl9yaWJvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21pdG8gPSBmaWx0ZXJfbWl0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfc2V0X3BhdGggPSAiL2RhdGFkcml2ZS9wcm9qZWN0cy9jZWxsYXNzaWduLWFuYWx5c2lzL2Rvd25sb2Fkcy9jMi5jcC5yZWFjdG9tZS52Ni4yLnN5bWJvbHMuZ210IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd2RhdCA9IHJvd0RhdGEoc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwpKQoKcGxvdF9tYXJrZXJzKHBhdGh3YXlfdGltZXBvaW50X3RmaCRwYXRod2F5cyAlPiUgcGx5cjo6cmVuYW1lKGMoJ3BhdGh3YXknPSdTeW1ib2wnLCAncS52YWwnPSdGRFInLCAnbWVhbl9sb2dGQyc9J2xvZ0ZDJykpICU+JSBkcGx5cjo6bXV0YXRlKGlzX3NpZ25pZmljYW50ID0gRkRSIDw9IDAuMDUpLCB0b3BfbiA9IDUsIGxvZ19xX3ZhbF90aHJlc2hvbGQgPSBOVUxMLCBucm93ID0gMSwgc3VidGl0bGUgPSAiVDIgdnMuIFQxIiwgdG9wX2RpcmVjdGlvbiA9ICJlcXVhbCIpCmBgYAoKYGBge3J9CnBhdGh3YXlfdGltZXBvaW50X2N5dG90b3hpYyA8LSBnYWdlX2FuYWx5c2lzKHNjZSA9IHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZF9mdWxsICU+JSBzY2F0ZXI6OmZpbHRlcihjZWxsdHlwZSA9PSAiQ3l0b3RveGljIFQgY2VsbHMiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uX3R5cGUgPSAidGltZXBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9yaWJvID0gZmlsdGVyX3JpYm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWl0byA9IGZpbHRlcl9taXRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9zZXRfcGF0aCA9ICIvZGF0YWRyaXZlL3Byb2plY3RzL2NlbGxhc3NpZ24tYW5hbHlzaXMvZG93bmxvYWRzL2MyLmNwLnJlYWN0b21lLnY2LjIuc3ltYm9scy5nbXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93ZGF0ID0gcm93RGF0YShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkX2xhYmVsZWRfZnVsbCkpCgpwbG90X21hcmtlcnMocGF0aHdheV90aW1lcG9pbnRfY3l0b3RveGljJHBhdGh3YXlzICU+JSBwbHlyOjpyZW5hbWUoYygncGF0aHdheSc9J1N5bWJvbCcsICdxLnZhbCc9J0ZEUicsICdtZWFuX2xvZ0ZDJz0nbG9nRkMnKSkgJT4lIGRwbHlyOjptdXRhdGUoaXNfc2lnbmlmaWNhbnQgPSBGRFIgPD0gMC4wNSksIHRvcF9uID0gNSwgbG9nX3FfdmFsX3RocmVzaG9sZCA9IE5VTEwsIG5yb3cgPSAxLCBzdWJ0aXRsZSA9ICJUMiB2cy4gVDEiLCB0b3BfZGlyZWN0aW9uID0gImVxdWFsIikKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwYXRod2F5X3RpbWVwb2ludF9jeXRvdG94aWMkcGF0aHdheXMgJT4lIGRwbHlyOjphcnJhbmdlKC1tZWFuX2xvZ0ZDKSAlPiUgaGVhZApgYGAKClVwcmVndWxhdGlvbiBvZiBQRC0xIChQRC0xIGJsb2NrYWRlPykgaW4gY3l0b3RveGljIFQgY2VsbHMgYXQgVDI/IENIRUNLIGlmIHRoaXMgY29ycmVzcG9uZHMgdG8gbWVtYmVyc2hpcCBpbiB0aGUgSUZORy1jb250YWluaW5nIHN1YmNsdXN0ZXIgb2YgQ0Q4IFQgY2VsbHMuIAoKYGBge3J9CnBhdGh3YXlfdGltZXBvaW50X25haXZlIDwtIGdhZ2VfYW5hbHlzaXMoc2NlID0gc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwgJT4lIHNjYXRlcjo6ZmlsdGVyKGNlbGx0eXBlID09ICJOYWl2ZS9DTSBDRDQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uX3R5cGUgPSAidGltZXBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9yaWJvID0gZmlsdGVyX3JpYm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWl0byA9IGZpbHRlcl9taXRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9zZXRfcGF0aCA9ICIvZGF0YWRyaXZlL3Byb2plY3RzL2NlbGxhc3NpZ24tYW5hbHlzaXMvZG93bmxvYWRzL2MyLmNwLnJlYWN0b21lLnY2LjIuc3ltYm9scy5nbXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93ZGF0ID0gcm93RGF0YShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkX2xhYmVsZWRfZnVsbCkpCgpwbG90X21hcmtlcnMocGF0aHdheV90aW1lcG9pbnRfbmFpdmUkcGF0aHdheXMgJT4lIHBseXI6OnJlbmFtZShjKCdwYXRod2F5Jz0nU3ltYm9sJywgJ3EudmFsJz0nRkRSJywgJ21lYW5fbG9nRkMnPSdsb2dGQycpKSAlPiUgZHBseXI6Om11dGF0ZShpc19zaWduaWZpY2FudCA9IEZEUiA8PSAwLjA1KSwgdG9wX24gPSA1LCBsb2dfcV92YWxfdGhyZXNob2xkID0gTlVMTCwgbnJvdyA9IDEsIHN1YnRpdGxlID0gIlQyIHZzLiBUMSIsIHRvcF9kaXJlY3Rpb24gPSAiZXF1YWwiKQpgYGAKCmBgYHtyfQpwYXRod2F5X3RpbWVwb2ludF9uYWl2ZSRwYXRod2F5cyAlPiUgZHBseXI6OmZpbHRlcihxLnZhbCA8IDAuMDUpICU+JSBkcGx5cjo6YXJyYW5nZSgtbWVhbl9sb2dGQykgJT4lIGhlYWQoMTApCmBgYAoKCmBgYHtyfQpwYXRod2F5X3RpbWVwb2ludF9tYWxpZ25hbnRiIDwtIGdhZ2VfYW5hbHlzaXMoc2NlID0gc2NlX2ZvbGxpY3VsYXJfbm9ybWFsaXplZF9sYWJlbGVkX2Z1bGwgJT4lIHNjYXRlcjo6ZmlsdGVyKGNlbGx0eXBlID09ICJCIGNlbGxzIiAmIG1hbGlnbmFudF9zdGF0dXNfbWFudWFsID09ICJtYWxpZ25hbnQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uX3R5cGUgPSAidGltZXBvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9yaWJvID0gZmlsdGVyX3JpYm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWl0byA9IGZpbHRlcl9taXRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9zZXRfcGF0aCA9ICIvZGF0YWRyaXZlL3Byb2plY3RzL2NlbGxhc3NpZ24tYW5hbHlzaXMvZG93bmxvYWRzL2MyLmNwLnJlYWN0b21lLnY2LjIuc3ltYm9scy5nbXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93ZGF0ID0gcm93RGF0YShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkX2xhYmVsZWRfZnVsbCkpCgpwbG90X21hcmtlcnMocGF0aHdheV90aW1lcG9pbnRfbWFsaWduYW50YiRwYXRod2F5cyAlPiUgcGx5cjo6cmVuYW1lKGMoJ3BhdGh3YXknPSdTeW1ib2wnLCAncS52YWwnPSdGRFInLCAnbWVhbl9sb2dGQyc9J2xvZ0ZDJykpICU+JSBkcGx5cjo6bXV0YXRlKGlzX3NpZ25pZmljYW50ID0gRkRSIDw9IDAuMDUpLCB0b3BfbiA9IDUsIGxvZ19xX3ZhbF90aHJlc2hvbGQgPSBOVUxMLCBucm93ID0gMSwgc3VidGl0bGUgPSAiVDIgdnMuIFQxIiwgdG9wX2RpcmVjdGlvbiA9ICJlcXVhbCIpCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KcGxvdF9tYXJrZXJzKHBhdGh3YXlfdGltZXBvaW50X21hbGlnbmFudGIkZ2VuZXMgJT4lIGFzLmRhdGEuZnJhbWUgJT4lIGRwbHlyOjptdXRhdGUoaXNfc2lnbmlmaWNhbnQgPSBGRFIgPD0gMC4wNSksIHRvcF9uID0gNSwgbG9nX3FfdmFsX3RocmVzaG9sZCA9IE5VTEwsIG5yb3cgPSAxLCBzdWJ0aXRsZSA9ICJUMiB2cy4gVDEiLCB0b3BfZGlyZWN0aW9uID0gImVxdWFsIiwgaGlnaGxpZ2h0X2dlbmVzID0gYygiVENMMUEiLCAiQkNMMiIsICJCQ0w2IiwgIkhMQS1BIiwgIkhMQS1CIiwgIkhMQS1DIiwgIkZDRVIyIiwgIkNENzQiKSkKYGBgCgpgYGB7cn0KcGF0aHdheV90aW1lcG9pbnRfbWFsaWduYW50YiRwYXRod2F5cyAlPiUgZHBseXI6OmZpbHRlcihxLnZhbCA8IDAuMDUpICU+JSBkcGx5cjo6YXJyYW5nZSgtbWVhbl9sb2dGQykgJT4lIGhlYWQoMTApCmBgYAoKYGBge3J9CnBhdGh3YXlfdGltZXBvaW50X25vbm1hbGlnbmFudGIgPC0gZ2FnZV9hbmFseXNpcyhzY2UgPSBzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkX2xhYmVsZWRfZnVsbCAlPiUgc2NhdGVyOjpmaWx0ZXIoY2VsbHR5cGUgPT0gIkIgY2VsbHMiICYgbWFsaWduYW50X3N0YXR1c19tYW51YWwgPT0gIm5vbm1hbGlnbmFudCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb25fdHlwZSA9ICJ0aW1lcG9pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3JpYm8gPSBmaWx0ZXJfcmlibywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9taXRvID0gZmlsdGVyX21pdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9wYXRoID0gIi9kYXRhZHJpdmUvcHJvamVjdHMvY2VsbGFzc2lnbi1hbmFseXNpcy9kb3dubG9hZHMvYzIuY3AucmVhY3RvbWUudjYuMi5zeW1ib2xzLmdtdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dkYXQgPSByb3dEYXRhKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZF9mdWxsKSkKCnBsb3RfbWFya2VycyhwYXRod2F5X3RpbWVwb2ludF9ub25tYWxpZ25hbnRiJHBhdGh3YXlzICU+JSBwbHlyOjpyZW5hbWUoYygncGF0aHdheSc9J1N5bWJvbCcsICdxLnZhbCc9J0ZEUicsICdtZWFuX2xvZ0ZDJz0nbG9nRkMnKSkgJT4lIGRwbHlyOjptdXRhdGUoaXNfc2lnbmlmaWNhbnQgPSBGRFIgPD0gMC4wNSksIHRvcF9uID0gNSwgbG9nX3FfdmFsX3RocmVzaG9sZCA9IE5VTEwsIG5yb3cgPSAxLCBzdWJ0aXRsZSA9ICJUMiB2cy4gVDEiLCB0b3BfZGlyZWN0aW9uID0gImVxdWFsIikKYGBgCgpgYGB7cn0KcGF0aHdheV90aW1lcG9pbnRfRkwxMDE4bWFsaWduYW50YiA8LSBnYWdlX2FuYWx5c2lzKHNjZSA9IHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZF9mdWxsICU+JSBzY2F0ZXI6OmZpbHRlcihjZWxsdHlwZSA9PSAiQiBjZWxscyIgJiBtYWxpZ25hbnRfc3RhdHVzX21hbnVhbCA9PSAibWFsaWduYW50IiAmIHBhdGllbnQgPT0gIkZMMTAxOCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb25fdHlwZSA9ICJ0aW1lcG9pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3JpYm8gPSBmaWx0ZXJfcmlibywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9taXRvID0gZmlsdGVyX21pdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX3NldF9wYXRoID0gIi9kYXRhZHJpdmUvcHJvamVjdHMvY2VsbGFzc2lnbi1hbmFseXNpcy9kb3dubG9hZHMvYzIuY3AucmVhY3RvbWUudjYuMi5zeW1ib2xzLmdtdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dkYXQgPSByb3dEYXRhKHNjZV9mb2xsaWN1bGFyX25vcm1hbGl6ZWRfbGFiZWxlZF9mdWxsKSkKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwbG90X21hcmtlcnMocGF0aHdheV90aW1lcG9pbnRfRkwxMDE4bWFsaWduYW50YiRnZW5lcyAlPiUgYXMuZGF0YS5mcmFtZSAlPiUgZHBseXI6Om11dGF0ZShpc19zaWduaWZpY2FudCA9IEZEUiA8PSAwLjA1KSwgdG9wX24gPSAxMCwgbG9nX3FfdmFsX3RocmVzaG9sZCA9IE5VTEwsIG5yb3cgPSAxLCBzdWJ0aXRsZSA9ICJUMiB2cy4gVDEiLCB0b3BfZGlyZWN0aW9uID0gImVxdWFsIiwgaGlnaGxpZ2h0X2dlbmVzID0gYygiVENMMUEiLCAiQkNMMiIsICJCQ0w2IiwgIkhMQS1BIiwgIkhMQS1CIiwgIkhMQS1DIiwgIkZDRVIyIiwgIkNENzQiKSkKYGBgCgojIEZBQ1MgdmFsaWRhdGlvbgoKU2hvdWxkIGJlIHJ1biB3aXRoIG1pbmltYWxseS1maWx0ZXJlZCBkYXRhc2V0IChpLmUuIGZpbHRlcmVkIGF0IDEwJSBtaXRvIG9yIGhpZ2hlciksIGFzIG9wcG9zZWQgdG8gYSA1JSBmaWx0ZXIgdGhhdCBjb3VsZCBiZSB1c2VkIGZvciBhbmFseXNpcy4gCgojIyBEYXRhIHsjYmlneHRhYmxlMn0KCmBgYHtyLCBlY2hvID0gRkFMU0V9CmZhY3NfdGFibGVfVCA8LSAiL2RhdGFkcml2ZS9kYXRhL2ZvbGxpY3VsYXIvRkFDUy9GTF9wYWlyZWQgVCBwb3BzLmNzdiIKCmZhY3NfVCA8LSBmcmVhZChmYWNzX3RhYmxlX1QsIHNlcCA9ICIsIiwgc2tpcCA9IDEpCmNvbG5hbWVzKGZhY3NfVClbMV0gPC0gImRhdGFzZXQiCgpmYWNzX1QgPC0gc3Vic2V0KGZhY3NfVCwgZGF0YXNldCAlaW4lIHVuaXF1ZShzY2VfZm9sbGljdWxhcl9ub3JtYWxpemVkX2xhYmVsZWQkZGF0YXNldCkpCgpjb2x1bW5fbWFwcGluZyA8LSBjKAogICdMSVZFL1NpbmdsZXRzXFxDb3VudFxcXFwnPSdTaW5nbGV0cycsCiAgJ0xJVkUvU2luZ2xldHMvTHltXFxDb3VudFxcXFwnPSdMeW1waG9jeXRlcycsCiAgJ0xJVkUvU2luZ2xldHMvTHltL1RcXENvdW50XFxcXCc9J1QgY2VsbHMnLAogICdMSVZFL1NpbmdsZXRzL0x5bS9UL0NENFxcQ291bnRcXFxcJz0nQ0Q0IFQgY2VsbHMnLAogICdMSVZFL1NpbmdsZXRzL0x5bS9UL0NENC9DRDQrTWVtXFxDb3VudFxcXFwnPSdDRDQgVCBtZW0nLAogICdMSVZFL1NpbmdsZXRzL0x5bS9UL0NENC9DRDQrTmFpdmVcXENvdW50XFxcXCc9J0NENCBUIG5haXZlJywKICAnTElWRS9TaW5nbGV0cy9MeW0vVC9DRDQvVGZoXFxDb3VudFxcXFwnPSdDRDQgVGZoJywKICAnTElWRS9TaW5nbGV0cy9MeW0vVC9DRDhcXENvdW50XFxcXCc9J0NEOCBUIGNlbGxzJywKICAnTElWRS9TaW5nbGV0cy9MeW0vVC9DRDgvQ0Q4K01lbVxcQ291bnRcXFxcJz0nQ0Q4IFQgbWVtJywKICAnTElWRS9TaW5nbGV0cy9MeW0vVC9DRDgvQ0Q4K05haXZlXFxDb3VudFxcXFwnPSdDRDggVCBuYWl2ZScKKQoKZmFjc19UX2xhYmVsZWQgPC0gZmFjc19UICU+JSBkcGx5cjo6c2VsZWN0KGMoImRhdGFzZXQiLCBuYW1lcyhjb2x1bW5fbWFwcGluZykpKSAlPiUgcGx5cjo6cmVuYW1lKGNvbHVtbl9tYXBwaW5nKQoKZmFjc19UX2xhYmVsZWRfcHJvcCA8LSBmYWNzX1RfbGFiZWxlZCAlPiUgCiAgZHBseXI6Om11dGF0ZSgKICAgIGBUIGNlbGxzYCA9IGBUIGNlbGxzYC9MeW1waG9jeXRlcywKICAgIGBDRDQgVCBjZWxsc2AgPSBgQ0Q0IFQgY2VsbHNgL0x5bXBob2N5dGVzLAogICAgYENENCBUIG1lbWAgPSBgQ0Q0IFQgbWVtYC9MeW1waG9jeXRlcywKICAgIGBDRDQgVCBuYWl2ZWAgPSBgQ0Q0IFQgbmFpdmVgL0x5bXBob2N5dGVzLAogICAgYENENCBUZmhgID0gYENENCBUZmhgL0x5bXBob2N5dGVzLAogICAgYENEOCBUIGNlbGxzYCA9IGBDRDggVCBjZWxsc2AvTHltcGhvY3l0ZXMsCiAgICBgQ0Q4IFQgbWVtYCA9IGBDRDggVCBtZW1gL0x5bXBob2N5dGVzLAogICAgYENEOCBUIG5haXZlYCA9IGBDRDggVCBuYWl2ZWAvTHltcGhvY3l0ZXMKICApCmBgYAoKYGBge3IsIGVjaG8gPSBGQUxTRX0Kc2NybmFfZmFjc19UIDwtIGZhY3NfVF9sYWJlbGVkX3Byb3AgJT4lIHBseXI6OmpvaW4oc2NybmFfcHJvcCkKbWV0YWRhdGEgPC0gc3Vic2V0KGNvbERhdGEoc2NlX2ZvbGxpY3VsYXIpLCBzZWxlY3QgPSBjKCJkYXRhc2V0IiwgInRpbWVwb2ludCIsICJ0cmFuc2Zvcm1lZF9wcm9ncmVzc2VkIiwgInBhdGllbnQiKSkgJT4lIHVuaXF1ZSAlPiUgYXMuZGF0YS5mcmFtZQpzY3JuYV9mYWNzX1QgPC0gc2NybmFfZmFjc19UICU+JSBwbHlyOjpqb2luKG1ldGFkYXRhKQpgYGAKCiMjIFQgY2VsbCBwcm9wb3J0aW9uCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpnZ3Bsb3Qoc2NybmFfZmFjc19ULCBhZXMoeD1gVCBjZWxsc2AsIHkgPSBgQ3l0b3RveGljIFQgY2VsbHMgKHNjcm5hKWAgKyBgTmFpdmUvQ00gQ0Q0IChzY3JuYSlgICsgYFQgcmVncyAoc2NybmEpYCArIGBUZmggKHNjcm5hKWApKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG91cj1wYXRpZW50KSkgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWVfUHVibGljYXRpb24oKSArIAogIGdlb21fYWJsaW5lKHNsb3BlID0gMSkgKyAKICB4bGFiKCJUIGNlbGwgcHJvcG9ydGlvbiAoRkFDUykiKSArIAogIHlsYWIoIlQgY2VsbCBwcm9wb3J0aW9uIChzY3JuYSkiKQpgYGAKCiMjIENENCBUIGNlbGwgKG91dCBvZiBUIGNlbGwpIHByb3BvcnRpb24KCmBgYHtyLCBlY2hvID0gRkFMU0V9CmdncGxvdChzY3JuYV9mYWNzX1QsIGFlcyh4PWBDRDQgVCBjZWxsc2AvYFQgY2VsbHNgLCB5ID0gKGBOYWl2ZS9DTSBDRDQgKHNjcm5hKWAgKyBgVCByZWdzIChzY3JuYSlgICsgYFRmaCAoc2NybmEpYCkvKGBDeXRvdG94aWMgVCBjZWxscyAoc2NybmEpYCArIGBOYWl2ZS9DTSBDRDQgKHNjcm5hKWAgKyBgVCByZWdzIChzY3JuYSlgICsgYFRmaCAoc2NybmEpYCkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG91cj1wYXRpZW50KSkgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWVfUHVibGljYXRpb24oKSArIAogIGdlb21fYWJsaW5lKHNsb3BlID0gMSkgKyAKICB4bGFiKCJDRDQgVC9UIGNlbGwgcHJvcG9ydGlvbiAoRkFDUykiKSArIAogIHlsYWIoIkNENCBUL1QgY2VsbCBwcm9wb3J0aW9uIChzY3JuYSkiKQpgYGAKCiMjIFRmaCBvdXQgb2YgQ0Q0IFQgY2VsbCBwcm9wb3J0aW9uCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpnZ3Bsb3Qoc2NybmFfZmFjc19ULCBhZXMoeD1gQ0Q0IFRmaGAvYENENCBUIGNlbGxzYCwgeSA9IGBUZmggKHNjcm5hKWAvKGBOYWl2ZS9DTSBDRDQgKHNjcm5hKWAgKyBgVCByZWdzIChzY3JuYSlgICsgYFRmaCAoc2NybmEpYCkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG91cj1wYXRpZW50KSkgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWVfUHVibGljYXRpb24oKSArIAogIGdlb21fYWJsaW5lKHNsb3BlID0gMSkgKyAKICB4bGFiKCJUZmgvQ0Q0IFQgY2VsbCBwcm9wb3J0aW9uIChGQUNTKSIpICsgCiAgeWxhYigiVGZoL0NENCBUIGNlbGwgcHJvcG9ydGlvbiAoc2NybmEpIikKYGBgCgpHZW5lcmFsbHkgZmFpcmx5IGNvbnNpc3RlbnQuIE5vdGUgdGhhdCBxdWFudGlmeWluZyBtZW1vcnkgVCBjZWxscyBpcyBhIHByb2JsZW0gc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGdvb2QgbWFya2VyIHRvIGRpc3Rpbmd1aXNoIG5haXZlIGZyb20gQ00uIAoKCgo=